home *** CD-ROM | disk | FTP | other *** search
- /*
- File: SampleUtils.c
-
- Description:
- This file contains a number of utility routines used by this
- sample application. These routines have been moved
- here to a separate file to simplify the example.
-
- Copyright:
- © Copyright 2000 Apple Computer, Inc. All rights reserved.
-
- Disclaimer:
- IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc.
- ("Apple") in consideration of your agreement to the following terms, and your
- use, installation, modification or redistribution of this Apple software
- constitutes acceptance of these terms. If you do not agree with these terms,
- please do not use, install, modify or redistribute this Apple software.
-
- In consideration of your agreement to abide by the following terms, and subject
- to these terms, Apple grants you a personal, non-exclusive license, under Apple’s
- copyrights in this original Apple software (the "Apple Software"), to use,
- reproduce, modify and redistribute the Apple Software, with or without
- modifications, in source and/or binary forms; provided that if you redistribute
- the Apple Software in its entirety and without modifications, you must retain
- this notice and the following text and disclaimers in all such redistributions of
- the Apple Software. Neither the name, trademarks, service marks or logos of
- Apple Computer, Inc. may be used to endorse or promote products derived from the
- Apple Software without specific prior written permission from Apple. Except as
- expressly stated in this notice, no other rights or licenses, express or implied,
- are granted by Apple herein, including but not limited to any patent rights that
- may be infringed by your derivative works or by other works in which the Apple
- Software may be incorporated.
-
- The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO
- WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
- WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN
- COMBINATION WITH YOUR PRODUCTS.
-
- IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
- GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION
- OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT
- (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN
- ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
- Change History (most recent first):
- Tue, Feb 8, 2000 -- created
- */
-
-
- #include "SampleUtils.h"
-
- #include <Processes.h>
- #include <string.h>
- #include <QuickDraw.h>
- #include <Gestalt.h>
- #include <Palettes.h>
- #include <Resources.h>
- #include <Appearance.h>
-
-
-
- /* SetWindowStandardStateSize sets the window's standard state rectangle
- to a rectangle of the size suggested in the width and height parameters.
- In the end, it may set the standard size to something smaller than the
- width and height parameters so the entire window remains visible. The
- standard rectangle is also centered on the main screen. The window's
- standard state rectangle is used by ZoomWindow whenever when it
- is called with the inZoomOut partcode. */
- void SetWindowStandardStateSize(WindowPtr window, short width, short height) {
- Rect standard, stdRect, global, device, c, s, diffs;
- RgnHandle tempRgn;
- GDHandle theDevice;
- CGrafPtr wport;
- Point origin;
- /* make the window's port the current port */
- wport = GetWindowPort(window);
- SetPort(wport);
- SetPt(&origin, 0, 0);
- LocalToGlobal(&origin);
- /* find the window's global coordinates */
- GetPortBounds(wport, &global);
- OffsetRect(&global, origin.h, origin.v);
- /* get the maximum intersecting screen */
- theDevice = GetMaxDevice(&global);
- device = (**theDevice).gdRect;
- /* if it's the main screen, adjust it for the menu bar height */
- if (theDevice == GetMainDevice())
- device.top += GetMBarHeight();
- /* calculate the difference between the window's content rectangle and its frame */
- tempRgn = NewRgn();
- GetWindowRegion(window, kWindowContentRgn, tempRgn);
- GetRegionBounds(tempRgn, &c);
- GetWindowRegion(window, kWindowStructureRgn, tempRgn);
- GetRegionBounds(tempRgn, &s);
- DisposeRgn(tempRgn);
- SetRect(&diffs, c.left - s.left + 2, c.top - s.top + 2, s.right - c.right + 2, s.bottom - c.bottom + 2);
- /* calculate the maximum bounds for the standard rectangle */
- SetRect(&standard, device.left + diffs.left, device.top + diffs.top, device.right - diffs.right, device.bottom - diffs.bottom);
- /* set up our 'desired' rectangle */
- SetRect(&stdRect, 0, 0, width, height);
- OffsetRect(&stdRect, standard.left, standard.top);
- /* fit it inside of the maximum allowable rectangle */
- SectRect(&stdRect, &standard, &stdRect);
- /* center it in the maximum allowable rectangle */
- OffsetRect(&stdRect, (standard.right - stdRect.right)/2, (standard.bottom - stdRect.bottom)/2);
- /* set the standard state rectangle */
- SetWindowStandardState(window, &stdRect);
- }
-
- #include <StdIO.h>
- #include <StdArg.h>
- #include <TextUtils.h>
-
-
-
-
- /* GetApplicationFolder returns the volume reference number and
- directory id of the folder containing the application. */
- OSStatus GetApplicationFolder(FSSpec *spec) {
- OSStatus err;
- FCBPBRec fcpb;
- Str255 name;
- CInfoPBRec cat;
- Handle h;
-
- h = GetResource('vTeZ', 0);
- if (h == NULL) return resNotFound;
-
- memset(&fcpb, 0, sizeof(fcpb));
- fcpb.ioVRefNum = 0;
- fcpb.ioNamePtr = name;
- fcpb.ioFCBParID = 0;
- fcpb.ioRefNum = HomeResFile(h);
- fcpb.ioFCBIndx = 0;
- if ((err = PBGetFCBInfoSync(&fcpb)) != noErr) return err;
-
- memset(&cat, 0, sizeof(cat));
- cat.dirInfo.ioNamePtr = name;
- cat.dirInfo.ioVRefNum = fcpb.ioFCBVRefNum;
- cat.dirInfo.ioFDirIndex = -1;
- cat.dirInfo.ioDrDirID = fcpb.ioFCBParID;
- err = PBGetCatInfoSync(&cat);
- if (err != noErr) return err;
-
- err = FSMakeFSSpec(fcpb.ioFCBVRefNum, cat.dirInfo.ioDrParID, name, spec);
- if (err != noErr) return err;
-
- return noErr;
- }
-
- /* DrawGrowIconWithoutScrollLines draws the grow icon in the bottom
- right corner of the frontmost window without drawing the scroll bar
- lines. It does this by setting the clip region to the bottom right corner
- before calling DrawGrowIcon. */
- void DrawGrowIconWithoutScrollLines(WindowPtr window) {
- RgnHandle clip;
- CGrafPtr wport;
- Rect r = { 0, 0, 16, 16 }, pbox;
- /* set the window to the current port */
- wport = GetWindowPort(window);
- SetPort(wport);
- GetPortBounds(wport, &pbox);
- /* save the old clipping region */
- clip = NewRgn();
- if (clip == NULL) return;
- GetClip(clip);
- /* set the clipping region to the bottom right corner of the window */
- OffsetRect(&r, pbox.right-15, pbox.bottom-15);
- ClipRect(&r);
- /* draw the grow icon */
- DrawGrowIcon(window);
- SetPort(wport);
- SetClip(clip);
- DisposeRgn(clip);
- }
-
-
-
-
- /* GrayOutBox grays out an area of the screen in the current grafport.
- *theBox is in local coordinates in the current grafport. This routine
- is for direct screen drawing only. */
- void GrayOutBox(Rect *theBox) {
- long response;
- Rect globalBox;
- GDHandle maxDevice;
- RGBColor rgbWhite = {0xFFFF, 0xFFFF, 0xFFFF}, rgbBlack = {0, 0, 0}, sForground, sBackground;
- PenState penSave;
- Pattern qdgray, qdblack;
- /* save the current drawing state */
- GetPenState(&penSave);
- /* if no color quickdraw, fail...*/
- if (Gestalt(gestaltQuickdrawVersion, &response) != noErr) response = 0;
- if (response >= gestalt8BitQD) {
- /* get the device for the rectangle */
- globalBox = *theBox;
- LocalToGlobal((Point*) &globalBox.top);
- LocalToGlobal((Point*) &globalBox.bottom);
- maxDevice = GetMaxDevice(&globalBox);
- if (maxDevice != NULL) {
- /* calculate the best gray */
- if ( GetGray(maxDevice, &rgbWhite, &rgbBlack)) {
- /* draw over the area in gray using addMax transfer mode */
- GetForeColor(&sForground);
- GetBackColor(&sBackground);
- RGBForeColor(&rgbBlack);
- RGBBackColor(&rgbWhite);
- PenMode(addMax);
- PenPat(GetQDGlobalsBlack(&qdblack));
- PaintRect(theBox);
- RGBForeColor(&sForground);
- RGBBackColor(&sBackground);
- /* restore the pen state and leave */
- SetPenState(&penSave);
- return;
- }
- }
- }
- /* fall through to using the gray pattern */
- GetQDGlobalsGray(&qdgray);
- PenPat(&qdgray);
- PenMode(notPatBic);
- PaintRect(theBox);
- SetPenState(&penSave);
- }
-
-
- /* RgnUnionRect adds the rectangle into the region. This routine works
- by creating a temporary rectangular region equivalent to srcRect
- and then calling UnionRgn. It's purpose is simply to stand in as a
- shorthand for that sequence of calls. */
- void RgnUnionRect(RgnHandle theRegion, Rect* srcRect) {
- RgnHandle temp;
- temp = NewRgn();
- RectRgn(temp, srcRect);
- UnionRgn(theRegion, temp, theRegion);
- DisposeRgn(temp);
- }
-
-
- /* SetScrollBarCursor sets the cursor according to the mouse position
- over a scroll bar. If the cursor is over the scroll bar, then the routine
- will return true and it will set the region mouseRgn to a region where
- the mouse should remain as it has been set. This region will be in global
- coordinates suitable for passing to WaitNextEvent in the mouse region
- parameter. */
- Boolean SetScrollBarCursor(ControlHandle scrollBar, Point where, RgnHandle mouseRgn) {
- Rect bounds;
- GetControlBounds(scrollBar, &bounds);
- if (PtInRect(where, &bounds)) {
- RgnHandle temp;
- temp = NewRgn();
- GetControlRegion(scrollBar, kControlIndicatorPart, temp);
- if (PtInRgn(where, temp)) {
- CopyRgn(temp, mouseRgn);
- SetThemeCursor(kThemeOpenHandCursor);
- } else {
- RectRgn(mouseRgn, &bounds);
- XorRgn(mouseRgn, temp, mouseRgn);
- SetThemeCursor(kThemePointingHandCursor);
- }
- DisposeRgn(temp);
- return true;
- } else return false;
- }
-
-
- /* GetMenuBarRegion sets the region mBarRgn to the global coordinates
- of the menu bar. */
- void GetMenuBarRegion(RgnHandle mBarRgn) {
- GDHandle mainDevice;
- Rect bounds;
- mainDevice = GetMainDevice();
- bounds = (**mainDevice).gdRect;
- bounds.bottom = bounds.top + GetMBarHeight();
- RectRgn(mBarRgn, &bounds);
- }
-
-